/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.socialfun.servicios;

import com.ec.socialfun.entidades.FormasDePago;
import com.ec.socialfun.entidades.Local;
import com.ec.socialfun.entidades.LocalesFormasDePago;
import com.ec.socialfun.enumeradores.EstadoEnum;
import com.ec.socialfun.excepciones.CrearFormaDePagoException;
import com.ec.socialfun.excepciones.FormaDePagoException;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.jboss.logging.Logger;

/**
 *
 * @author xavier
 */
@Stateless
public class LocalesFormasDePagoFacade extends AbstractFacade<LocalesFormasDePago> {

    private static final Logger LOG = Logger.getLogger(LocalesFormasDePagoFacade.class.getName());
    @PersistenceContext(unitName = "SocialFunPU")
    private EntityManager em;
    @EJB
    private FormasDePagoFacade formasDePagoFacade;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public LocalesFormasDePagoFacade() {
        super(LocalesFormasDePago.class);
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void crearFormaPagoParaLocal(Local local, FormasDePago formaDePago, String estado) throws CrearFormaDePagoException {
        try {

            try {
                formasDePagoFacade.verificarExisteEnLocal(local, formaDePago);
                //si existe solo cambiar de estado
                LocalesFormasDePago localesFormasDePago = recuperaPorLocalYFormaPago(local, formaDePago);
                localesFormasDePago.setLoFpEstado(estado);
                this.edit(localesFormasDePago);
            } catch (FormaDePagoException e) {
                // no existe crear uno nuevo
                LocalesFormasDePago localesFormaDePago = new LocalesFormasDePago();
                localesFormaDePago.setLoCodigo(local);
                localesFormaDePago.setFpCodigo(formaDePago);
                localesFormaDePago.setLoFpEstado(EstadoEnum.ACTIVO.getCodigo());
                this.create(localesFormaDePago);
            }
        } catch (Exception e) {
            LOG.error("Error al crear forma de pago " + e);
            throw new CrearFormaDePagoException("Error al crear forma de pago ");
        }
    }

    public LocalesFormasDePago recuperaPorLocalYFormaPago(Local local, FormasDePago formasDePago) throws FormaDePagoException {

        try {
            Query q = em.createNamedQuery("LocalesFormasDePago.recuperaPorLocalYFormaPago");
            q.setParameter("fpCodigo", formasDePago.getFpCodigo());
            q.setParameter("loCodigo", local.getLoCodigo());
            return (LocalesFormasDePago) q.getSingleResult();
        } catch (NoResultException e) {
            //LOG.error("Error al crear forma de pago " + local.getLoCodigo() + " " + local.getLoCodigo() + " Error: " + e);
            throw new FormaDePagoException();
        }

    }
    
    public List<LocalesFormasDePago> recuperaPorEstadoYLocal(Local local) throws FormaDePagoException {

        try {
            LOG.info("local " + local.getLoCodigo());
            Query q = em.createNamedQuery("LocalesFormasDePago.recuperaPorEstadoYLocal");
            q.setParameter("loFpEstado", "ACT");
            q.setParameter("loCodigo",local.getLoCodigo());
            List<LocalesFormasDePago> localesFormasDePago = q.getResultList();
            LOG.info("tamanio " + localesFormasDePago.size());
            return localesFormasDePago;
        } catch (NoResultException e) {
            //LOG.error("Error al crear forma de pago " + local.getLoCodigo() + " " + local.getLoCodigo() + " Error: " + e);
            throw new FormaDePagoException();
        }

    }
}
